From: Florian Müllner Date: Wed, 11 Jun 2014 11:13:12 +0000 (+0200) Subject: appDisplay: Use GrabHelper for folder popups X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~2425 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=5d00c1a5ee4e3fc3a7a3aef2d1439dd83c4a7bd6;p=gnome-shell.git appDisplay: Use GrabHelper for folder popups As clicks outside the app picker should still be handled normally while clicks inside should dismiss the popup, we cannot make full use of GrabHelper. However using it at least for focus handling fixes some minor details we are getting wrong, for instance not restoring the previous focus after dismissing a folder popup. --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index e43a67938..854acd1b4 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -16,6 +16,7 @@ const Atk = imports.gi.Atk; const AppFavorites = imports.ui.appFavorites; const BoxPointer = imports.ui.boxpointer; const DND = imports.ui.dnd; +const GrabHelper = imports.ui.grabHelper; const IconGrid = imports.ui.iconGrid; const Main = imports.ui.main; const Overview = imports.ui.overview; @@ -1249,18 +1250,7 @@ const AppFolderPopup = new Lang.Class({ function() { this.actor.destroy(); })); - this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress)); - }, - - _onKeyPress: function(actor, event) { - if (!this._isOpen) - return Clutter.EVENT_PROPAGATE; - - if (event.get_key_symbol() != Clutter.KEY_Escape) - return Clutter.EVENT_PROPAGATE; - - this.popdown(); - return Clutter.EVENT_STOP; + this._grabHelper = new GrabHelper.GrabHelper(this.actor); }, toggle: function() { @@ -1274,6 +1264,12 @@ const AppFolderPopup = new Lang.Class({ if (this._isOpen) return; + this._isOpen = this._grabHelper.grab({ actor: this.actor, + onUngrab: Lang.bind(this, this.popdown) }); + + if (!this._isOpen) + return; + this.actor.show(); this._boxPointer.setArrowActor(this._source.actor); @@ -1282,7 +1278,6 @@ const AppFolderPopup = new Lang.Class({ this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); - this._isOpen = true; this.emit('open-state-changed', true); }, @@ -1290,6 +1285,8 @@ const AppFolderPopup = new Lang.Class({ if (!this._isOpen) return; + this._grabHelper.ungrab({ actor: this.actor }); + this._boxPointer.hide(BoxPointer.PopupAnimation.FADE | BoxPointer.PopupAnimation.SLIDE); this._isOpen = false;